package activity;

import helper.FilesHelper;

import java.io.IOException;
import java.util.HashMap;
import java.util.InputMismatchException;
import java.util.Scanner;
import java.util.Set;

import model.Cliente;
import model.Produto;
import controller.ClienteController;
import dao.ClienteDAO;
import dao.PedidoDAO;
import dao.ProdutoDAO;

public class Main {

	// Lista de todos os clientes, carregados do txt pelo FilesHelper
	// OBS: O HashMap de clientes tem chaves String (motivo: CPF)
	static HashMap<String, Cliente> clientes = new HashMap<String, Cliente>();

	// Lista de todos os produtos oferecidos, carregado pelo FilesHelper
	// OBS: O HashMap de produtos tem chaves Int (motivo: codigo de produto)
	static HashMap<Integer, Produto> produtos = Produto.getProdutoList();

	/*
	 * Ao comecar o atendimento, selecionar um cliente e deixa-lo na memoria....
	 * poupa trabalho em muitos momentos. mas teremos que colocar algum
	 * tratamento para poder trocar o cliente em algum momento
	 */
	public static Cliente currentCliente;

	static Scanner sc = new Scanner(System.in);

	public static void main(String[] args) {
		
		// Carregando hash com clientes e hash com produtos
		while(true){
			try {
				clientes = FilesHelper.leClientesSerializados(); //carrega clientes do arquivo ser
				break;
			} catch (IOException e) {
					try{
						FilesHelper.serializaClientes(clientes); //caso nao haja arquivo, cria um
					}
					catch(IOException eIO){
						System.err.println();
					}
			} catch (ClassNotFoundException e) {
				System.err.println(e);
			}
		}
		
		while(true){
			try {
				produtos = FilesHelper.leProdutosSerializados(); //carrega produtps do arquivo ser
				break;
			} catch (IOException e) {
					try{
						FilesHelper.serializaProdutos(produtos); //caso nao haja, cria um
					}
					catch(IOException eIO){
						System.err.println();
					}
	
			} catch (ClassNotFoundException e) {
				System.err.println(e);
			}
		}
			

		int opcao;
		do {
			sc = new Scanner(System.in);
			opcao = 0;
			System.out.println("Digite para acessar o menu:");
			System.out.println("1) Pedidos");
			System.out.println("2) Clientes");
			System.out.println("3) Produtos");
			System.out.println("4) Relatorios");
			System.out.println("5) Sair");

			try {
				opcao = sc.nextInt();

				if (opcao == 1) { // Pedidos
					opcaoPedidos();

				} if (opcao == 2) { // Clientes
					opcaoClientes();

				} if (opcao == 3) { // Produtos
					opcaoProdutos();

				} if (opcao == 4) { // Relatorios
					opcaoRelatorios();

				} if(opcao == 5) { // Salvar e sair
					try {//gravar produtos.ser
						FilesHelper.serializaProdutos(produtos);
					} catch (IOException e) {
						System.err.println(e);

					}
					try {//gravar clientes.ser
						FilesHelper.serializaClientes(clientes);
					} catch (IOException e) {
						System.err.println(e);
					}
				} if((opcao < 1) || (opcao > 5)){
					System.err.println("Digite um valor entre 1 e 5");
				}
			} catch (InputMismatchException e) {
				System.err.println("Valor invalido: \nDigite um valor valido");
				sc.nextLine();
			}
		} while (!(opcao == 5));

	}

	private static void opcaoRelatorios() {
        int entrada = 0;
        do {
        	sc = new Scanner(System.in);
            System.out.println("Digite para escolher:");
            System.out.println("1) Listar Clientes");
            System.out.println("2) Listar Produtos");
            System.out.println("3) Listar Pedidos por Clientes");
            System.out.println("4) Faturamento Total");
            System.out.println("5) Sair");

            try {
                entrada = sc.nextInt();
                if(sc.hasNextLine())sc.nextLine();
                if (entrada == 1) { // imprimir clientes
                    Set<String> clientesKeys = clientes.keySet();
                    if(clientesKeys.isEmpty()){
                    	System.err.println("Nao ha nenhum cliente cadastrado.");
                    } else{
                    		for (String key : clientesKeys)
                    			clientes.get(key).imprimir(false);
                    }
                    
                } if (entrada == 2) { // imprimir produtos
                    Set<Integer> produtosKeys = produtos.keySet();
                    if(produtosKeys.isEmpty()){
                    	System.err.println("Nao ha nenhum produto cadastrado.");
                    } else{
		                    for (Integer key : produtosKeys)
		                        produtos.get(key).imprimir();
                    }
                    
                } if (entrada == 3) { // imprimir pedidos por
                                                    // clientes
                    Set<String> clientesKeys = clientes.keySet();
                    if(clientesKeys.isEmpty()){
                    	System.err.println("Nao ha nenhum pedido registrado deste cliente.");
                    } else{
		                    for (String key : clientesKeys)
		                        clientes.get(key).imprimir(true);
                    }
                    
                } if (entrada == 4) { // imprimir faturamento total
                    PedidoDAO.faturamento(clientes);
                    
                } if((entrada < 1) || (entrada > 5)){
					System.err.println("Digite um valor entre 1 e 5");
				}
				
			} catch (InputMismatchException e) {
				System.err.println("Valor invalido: \nDigite um valor valido");
				sc.nextLine();
			}

        } while (!(entrada == 5));

    }

	private static void opcaoProdutos() {
		int entrada = 0;
		do {
			sc = new Scanner(System.in);
			System.out.println("Digite para escolher:");
			System.out.println("1) Incluir");
			System.out.println("2) Alterar");
			System.out.println("3) Excluir");
			System.out.println("4) Sair");

			try {
				entrada = sc.nextInt();
				sc.nextLine();

				if (entrada == 1) { // Inserir produto
					ProdutoDAO.incluir(produtos);
					System.err.println(ProdutoDAO.getMsg());

				} if (entrada == 2) { // Alterar produto
					ProdutoDAO.alterar(produtos);
					System.err.println(ProdutoDAO.getMsg());

				} if (entrada == 3) { // Excluir produto
					ProdutoDAO.excluir(produtos);
					System.err.println(ProdutoDAO.getMsg());

				} if((entrada < 1) || (entrada > 4)){
					System.err.println("Digite um valor entre 1 e 4");
				}
			} catch (InputMismatchException e) {
				System.err.println("Valor invalido: \nDigite um valor valido");
				sc.nextLine();
			}

		} while (!(entrada == 4));

	}

	private static void opcaoClientes() {
		int entrada = 0;
		do {
			sc = new Scanner(System.in);
			System.out.println("Digite para escolher:");
			System.out.println("1) Incluir");
			System.out.println("2) Alterar");
			System.out.println("3) Excluir");
			System.out.println("4) Sair");

			try {
				entrada = sc.nextInt();
				sc.nextLine();

				if (entrada == 1) {
					ClienteDAO.incluir(clientes);
					System.err.println(ClienteDAO.getMsg());

				} if (entrada == 2) {
					ClienteDAO.alterar(clientes);
					System.err.println(ClienteDAO.getMsg());

				} if (entrada == 3) {
					ClienteDAO.excluir(clientes);
					//System.err.println(ClienteDAO.getMsg());

				} if((entrada < 1) || (entrada > 4)){
					System.err.println("Digite um valor entre 1 e 4");
				}
			} catch (InputMismatchException e) {
				System.err.println("Valor invalido: \nDigite um valor valido");
				sc.nextLine();
			}
		} while (!(entrada == 4));
	}

	private static void opcaoPedidos() {
		int entrada = 0;
		String entradaEscolha = "";
		boolean acabouDeEscolher = false;
		if (currentCliente == null) {
			currentCliente = ClienteController.escolherCliente(clientes);
			acabouDeEscolher = true;
		} else {
			if (!acabouDeEscolher) {
				currentCliente = null;

				while(true){
					sc = new Scanner(System.in);
					System.out.println("Deseja trocar de cliente?(S/N)");
					try {
						entradaEscolha = sc.next();
						sc.nextLine();
	
						if (entradaEscolha.equalsIgnoreCase("s")) {
							currentCliente = ClienteController.escolherCliente(clientes);
							break;
							
						} if (entradaEscolha.equalsIgnoreCase("n")) {
							currentCliente = null;
							break;
						}
						if(!(entradaEscolha.equalsIgnoreCase("s")||entradaEscolha.equalsIgnoreCase("n"))){
							System.err.println("Valor invalido: \nDigite S para sim, N para nao");
						
						}
						
					} catch (InputMismatchException e) {
						System.err.println("Valor invalido: \nDigite um valor valido");
						sc.nextLine();
					}
				}

			}
		}
		entrada = 0;
		if (currentCliente != null) {

			do {
				System.out.println("Digite para escolher:");
				System.out.println("1) Cadastrar");
				System.out.println("2) Alterar/Cancelar");
				System.out.println("3) Sair");

				try {
					entrada = sc.nextInt();
					sc.nextLine();
					
					if (entrada == 1) { // Cadastrar
						PedidoDAO.incluir(produtos, currentCliente);
						System.err.println(PedidoDAO.getMsg());

					} else if (entrada == 2) { // Alterar`
						PedidoDAO.alterar(currentCliente);
						System.err.println(PedidoDAO.getMsg());

					} if((entrada < 1) || (entrada > 3)){
						System.err.println("Digite um valor entre 1 e 3");
					}
				} catch (InputMismatchException e) {
					System.err.println("Valor invalido: \nDigite um valor valido");
					sc.nextLine();
				}

			} while (!(entrada == 3));

		} else {
			System.err.println("Cliente nao encontrado");
		}
	}
}